/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package progweb.project.Servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import progweb.project.Manager.DBManager;
import progweb.project.Manager.GUIManager;
import progweb.project.Manager.Medico;
import org.apache.log4j.*;

/**
 *
 * @author michele
 */
public class LoginFilter extends HttpServlet {
    private static org.apache.log4j.Logger log=Logger.getLogger(LoginFilter.class);
    PrintWriter out;

    @Override
    public void init() throws ServletException {
        super.init();
        //Configurazione dei log
        PropertyConfigurator.configure(this.getClass().getClassLoader().getResource("log4j.properties"));
    }
    
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        this.out = response.getWriter();
        String page="index.html";
        String page2="registrazione.html";
        RequestDispatcher rd;
        String fname,lname,id;
        
        /*prende il parametro dal form*/
        log.info("Lettura parametri username e password dal form");
        String username=request.getParameter("uname");
        String pass=request.getParameter("upwd");
        
        /*se l'username non è della forma NOME.COGNOME, forward su errorservlet*/
        if(!username.contains(".")){
            log.warn("Username non nella forma NOME.COGNOME");
            request.setAttribute("error", "L'username deve essere della forma NOME.COGNOME");
            request.setAttribute("page", page);
            rd=request.getRequestDispatcher("/ErrorServlet");
            rd.forward(request, response);                
        }
        /*se i campi username o password sono vuoti da errore, forward su errorservlet*/
        else if(username.equals("")||(pass.equals(""))){
            log.warn("Username o password assenti");
            request.setAttribute("error", "ATTENZIONE! Inserisci username e password.");
            request.setAttribute("page", page);
            rd=request.getRequestDispatcher("/ErrorServlet");
            rd.forward(request, response);                
        }        
        else{
            log.info("Username e password inseriti correttamente");
            
            /*parso da username nome e cognome utente*/
            fname=username.substring(0, username.indexOf("."));
            lname=username.substring(username.indexOf(".")+1, username.length());
            
            log.info("Controllo dell'esistenza dell'user nel DB");
            /*utente non nel db*/
            if(DBManager.checkUser(fname, lname)==-1){
                log.warn("User non presente nel DB");
                request.setAttribute("error", "ATTENZIONE! Controlla che i dati inseriti siano corretti.");
                request.setAttribute("page", page);
                rd=request.getRequestDispatcher("/ErrorServlet");
                rd.forward(request, response);
            }
            
            /*medico*/
            else if(DBManager.checkUser(fname, lname)==1){
                
                /*controllo password*/
                if(DBManager.checkPassword(fname, lname, pass, 1)){
                    
                    /*prende l'id del medico e la passa alla servlet di welcome medico*/
                    id=DBManager.getMedicoID(fname, lname);
                    
                    /*se si verifica errore nel prendere l'id rimanda all'error servlet*/
                    if(id.matches("")){
                        log.error("Errore nel recupero dell'id");
                        request.setAttribute("error", "Si è verificato un errore, torna indietro e riprova");
                        request.setAttribute("page", page);
                        rd=request.getRequestDispatcher("/ErrorServlet");
                        rd.forward(request, response);
                    }
                    else{
                        //Utente esistente, creo sessione e cookies
                        log.info("User di tipo medico: creazione della sessione e dei cookies");
                        Medico medico=DBManager.getMedicoFromId(Integer.parseInt(id));
                        request.getSession(true);
                        request.getSession().setAttribute("guimanager", new GUIManager(this.out));
                        request.getSession().setAttribute("user", medico);
                        request.getSession().setAttribute("type", "medico");
                        request.getSession().setAttribute("lastaccess", " - ");
                        
                        Cookie[] cookies=request.getCookies();
                        Cookie accesso=new Cookie("accesso"+medico.getId(), new Timestamp(System.currentTimeMillis()).toString().substring(0, 19));
                        if (cookies!=null) {
                            for (int i=0; i<cookies.length; i++) {
                                if (cookies[i].getName().compareTo(accesso.getName())==0)
                                    request.getSession().setAttribute("lastaccess", cookies[i].getValue());
                            }
                        }
                        accesso.setMaxAge(31104000);
                        response.addCookie(accesso);
                        
                        rd=request.getRequestDispatcher("/LoginServLet");
                        rd.forward(request, response);
                    }
                }
                else {
                    log.warn("Password non corretta");
                    request.setAttribute("error", "ATTENZIONE! Controlla che la password inserita sia corretta.");
                    request.setAttribute("page", page);
                    rd=request.getRequestDispatcher("/ErrorServlet");
                    rd.forward(request, response);
                }
            }
            /*paziente*/
            else if(DBManager.checkUser(fname, lname)==2){
                
                /*se password è NULL utente deve registrarsi*/
                if(DBManager.isPasswordNull(fname, lname)){
                    log.warn("Utente non registrato");
                    request.setAttribute("error", "ATTENZIONE! Utente non registrato! Puoi registrati a <a href="+page2+">questo indirizzo</a>");
                    request.setAttribute("page", page);
                    rd=request.getRequestDispatcher("/ErrorServlet");
                    rd.forward(request, response);
                }
                else{
                    /*controllo password*/
                    if(DBManager.checkPassword(fname, lname, pass, 2)){
                        
                        /*prende l'id del paziente e la passa alla servlet loginservlet*/
                        id=String.valueOf(DBManager.getPazienteID(fname, lname));
                        
                        /*se si verifica errore nel prendere l'id rimanda all'error servlet*/
                        if(id.equals("")){
                            log.error("Errore nel recupero dell'id");
                            request.setAttribute("error", "Si è verificato un errore, torna indietro e riprova");                            
                            request.setAttribute("page", page);
                            rd=request.getRequestDispatcher("/ErrorServlet");
                            rd.forward(request, response);
                        }
                        else {
                            //Utente esistente, creo sessione
                            log.info("User di tipo paziente: creazione della sessione");
                            request.getSession(true);
                            request.getSession().setAttribute("guimanager", new GUIManager(this.out));
                            request.getSession().setAttribute("user",DBManager.getPazienteFromId(Integer.parseInt(id)));
                            request.getSession().setAttribute("type", "paziente");
                            rd=request.getRequestDispatcher("/LoginServLet");
                            rd.forward(request, response);
                        }
                    }
                    else {
                        log.warn("Password non corretta");                        
                        request.setAttribute("error", "ATTENZIONE! Controlla che la password inserita sia corretta.");
                        request.setAttribute("page", page);
                        rd=request.getRequestDispatcher("/ErrorServlet");
                        rd.forward(request, response);
                    }
                }
            }
        }
    }
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
            processRequest(request,response);
            
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
